package cn.tedu.springboot01;

import cn.tedu.springboot01.controller.UserController;
import cn.tedu.springboot01.entity.User;
import cn.tedu.springboot01.service.UserService;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.test.web.servlet.MockMvc;

import static
        org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static
        org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;

/**
 * @WebMvcTest可以对Web层(Controller层)进行分片测试，其他组件一律不进行测试
 * @WebMvcTest(UserController.class)，Spring Boot值创建UserController的Java Bean,其他组件都不创建
 * userController中所依赖的组件，需要使用@MockBean创建模拟对象
 * 创建好的对象可以自动的注册倒Spring容器中，然后可以自动实现资源的注入
 */
@WebMvcTest(UserController.class)
public class WebMvcTestDemo {

    @MockBean
    UserService userService;

    @Autowired
    MockMvc mockMvc;

    @BeforeEach
    void init() {
        Mockito.when(userService.login("John", "1234"))
                .thenReturn(new User(1, "John", "1234", "ADMIN"));
    }

    @Test
    void testLogin() throws Exception {
        String url = "/users/login?username={0}&pwd={1}";
        mockMvc.perform(get(url, "John", "1234"))
                .andExpect(status().isOk())
                .andExpect(content().string("登录成功！"));
        System.out.println("login ok");
    }

}
